RichTextBox for UWP
手順3:アプリケーションコードの追加
チュートリアル > C1RichTextBox コンテンツの印刷 > 手順3:アプリケーションコードの追加

前の手順では、リソースファイルを追加し、アプリケーションへのコードの追加を開始しました。この手順では、残りのアプリケーションコードを追加します。

  1. まず、Printing_Loaded イベント、Printing_Unloaded イベント、および btnPrint_Click イベントをイベントハンドラ領域内に追加します。

    C# コードの書き方

    C#
    コードのコピー
    #region event handlers
            void Printing_Unloaded(object sender, RoutedEventArgs e)
            {
                UnregisterForPrinting();
            }
    
            void Printing_Loaded(object sender, RoutedEventArgs e)
            {
                // 印刷を初期化します
                RegisterForPrinting();
            }
    
            private async void btnPrint_Click(object sender, RoutedEventArgs e)
            {
                await Windows.Graphics.Printing.PrintManager.ShowPrintUIAsync();
            }
            #endregion
    
  2. 印刷を実装するための領域を作成します。
    C#
    コードのコピー
     #region implemention
     #endregion
    
  3. 実装領域内に、PrintTaskRequested イベントハンドラを追加します。

    C# コードの書き方

    C#
    コードのコピー
     /// <summary>
            /// これは、PrintManager.PrintTaskRequested のイベントハンドラです。
            /// </summary>
            /// <param name="sender">PrintManager</param>
            /// <param name="e">PrintTaskRequestedEventArgs </param>
            protected void PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs e)
            {
                PrintTask printTask = null;
                printTask = e.Request.CreatePrintTask("SamplePDF", sourceRequested =>
                {
                    // 印刷ジョブが完了すると、印刷タスクのイベントハンドラが呼び出されます。
                    printTask.Completed += async (s, args) =>
                    {
                        // 印刷操作が失敗したらユーザーに通知します。
                        if (args.Completion == PrintTaskCompletion.Failed)
                        {
                            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                            {
                                MessageDialog dialog = new MessageDialog("Failed to print.");
                                dialog.ShowAsync();
                            });
                        }
                    };
    
  4. PrintTaskRequested イベントハンドラのすぐ下に、印刷サイズや印刷方向などのオプションを設定します。

    C# コードの書き方

    C#
    コードのコピー
    // 用紙サイズや用紙方向などの印刷オプションを設定します
                    Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                    {
                        var layout = rtb.ViewManager.PresenterInfo as C1PageLayout;
                        if (layout != null && layout.Width > layout.Height)
                        {
                            printTask.Options.Orientation = PrintOrientation.Landscape;
                        }
                    });
    
                    sourceRequested.SetSource(printDocumentSource);
                });
    
            }
    
  5. 次に追加するメソッドは、印刷用アプリケーションを Windows に登録し、印刷プロセスのイベントハンドラを設定します。

    C# コードの書き方

    C#
    コードのコピー
     /// <summary>
            /// このメソッドは、印刷用アプリケーションを Windows に登録し、印刷プロセスに必要なイベントハンドラを設定します。
            /// </summary>
            protected void RegisterForPrinting()
            {
                // PrintDocument を作成します。
                printDocument = new PrintDocument();
    
                // DocumentSource を保存します。
                printDocumentSource = printDocument.DocumentSource;
    
                // 印刷プレビューを設定するイベントハンドラを追加します。
                printDocument.Paginate += Paginate;
    
                // 指定されたプレビューページを提供するイベントハンドラを追加します。
                printDocument.GetPreviewPage += GetPrintPreviewPage;
    
                // すべての最終印刷ページを提供するイベントハンドラを追加します。
                printDocument.AddPages += AddPrintPages;
    
                // PrintManager を作成し、印刷初期化のハンドラを追加します。
                PrintManager printMan = PrintManager.GetForCurrentView();
                printMan.PrintTaskRequested += PrintTaskRequested;
            }
    
  6. 印刷用アプリケーションを登録解除するメソッドを追加します。

    C# コードの書き方

    C#
    コードのコピー
     /// <summary>
            /// このメソッドは、印刷用アプリケーションの Windows への登録を解除します。
            /// </summary>
            protected void UnregisterForPrinting()
            {
                if (printDocument == null)
                    return;
    
                printDocument.Paginate -= Paginate;
                printDocument.GetPreviewPage -= GetPrintPreviewPage;
                printDocument.AddPages -= AddPrintPages;
    
                // 印刷初期化のハンドラを削除します。
                PrintManager printMan = PrintManager.GetForCurrentView();
                printMan.PrintTaskRequested -= PrintTaskRequested;
            }
    
  7. 実装領域内に最後に追加するコードには、3つのイベントハンドラがあります。

    C# コードの書き方

    C#
    コードのコピー
      /// <summary>
            /// これは、PrintDocument.Paginate のイベントハンドラです。
            /// PrintManager が印刷プレビューを要求すると起動します
            /// </summary>
            /// <param name="sender">PrintDocument</param>
            /// <param name="e">Paginate Event Arguments</param>
            protected void Paginate(object sender, PaginateEventArgs e)
            {
                pages.Clear();
    
                viewManager = new C1RichTextViewManager
                {
                    Document = rtb.Document,
                    PresenterInfo = rtb.ViewManager.PresenterInfo
                };
    
                PrintDocument printDoc = (PrintDocument)sender;
                // プレビューページ数を報告します
                printDoc.SetPreviewPageCount(rtb.ViewManager.Presenters.Count, PreviewPageCountType.Intermediate);
            }
    
            /// <summary>
            /// これは、PrintDocument.GetPrintPreviewPage のイベントハンドラです。特定の印刷プレビューページを
            /// UIElement の形式で PrintDocument のインスタンスに提供します。次に PrintDocument は、この UIElement を
            /// Windows 印刷システムが処理できるページに変換します。
            /// </summary>
            /// <param name="sender">PrintDocument</param>
            /// <param name="e">プレビュー要求されたページを含む引数</param>
            protected void GetPrintPreviewPage(object sender, GetPreviewPageEventArgs e)
            {
                // 最初のページを追加します
                if (e.PageNumber == 1)
                    AddOnePrintPreviewPage(0);
    
                PrintDocument printDoc = (PrintDocument)sender;
                printDoc.SetPreviewPage(e.PageNumber, pages[e.PageNumber - 1]);
                // 他のページを追加します
                if (e.PageNumber == 1)
                    for (int i = 1; i < viewManager.Presenters.Count; i++)
                        AddOnePrintPreviewPage(i);
            }
    
            /// <summary>
            /// これは、PrintDocument.AddPages のイベントハンドラです。印刷するすべてのページを
            /// UIElement の形式で PrintDocument のインスタンスに提供します。次に PrintDocument は、これらの UIElement を
            /// Windows 印刷システムが処理できるページに変換します。
            /// </summary>
            /// <param name="sender">PrintDocument</param>
            /// <param name="e">印刷タスクのオプション参照を含むページ追加イベントの引数</param>
            protected void AddPrintPages(object sender, AddPagesEventArgs e)
            {
                // すべてのページをループし、印刷する各ページを追加します
                foreach (FrameworkElement page in pages)
                {
                    printDocument.AddPage(page);
                }
                PrintDocument printDoc = (PrintDocument)sender;
                // すべての印刷ページが準備できたことを示します
                printDoc.AddPagesComplete();
            }
    
            void AddOnePrintPreviewPage(int index)
            {
                var page = (FrameworkElement)printTemplate.LoadContent();
                page.DataContext = viewManager.Presenters[index];
                if (!pages.Contains(page))
                    pages.Add(page);
            }
    

この手順では、アプリケーションコードを追加しました。次の手順では、このアプリケーションを実行します。